// 1. 一个类只有一个实例
// 2. 全局可访问该实例
// 3. 自行实例化
// 4. 可推迟初始化, 即延迟执行

// let  Singleton= function(name){
//     this.name =name;
//     this.instance = null
// }

// Singleton.getInstance = (name)=>{
//     if(this.instance){
//         return this.instance
//     }else{
//         return this.instance = new Singleton(name)
//     }
// }
// Singleton.prototype.getName = function (){
//     return this.name
// }

// let Tom = Singleton.getInstance('tom');
// let Jack = Singleton.getInstance('jack');

// console.log(Tom === Jack);
// console.log(Tom.getName());
// console.log(Jack.getName());


//回调函数版的单例模式 , 可以使用New关键字来定义的单例模式
// let CreateSingleton = (function(){
//     let instance;
//     return function(name){
//         if(instance){
//             return instance
//         }else{
//             this.name = name;
//             return instance = this;
//         }
//     }
// })();

// CreateSingleton.prototype.getName = function(){
//     console.log(this.name);
// }

// let Winner = new CreateSingleton('Winner');
// let Loser = new CreateSingleton('Loser');

// console.log(Winner === Loser);
// console.log(Winner.getName());
// console.log(Loser.getName());



// 003 class实现的单例模式
class Singleton {
    private name : string;
    static instance : any;
    constructor(name){
        this.name = name;
        Singleton.instance = null;
    }

    getName(){
        return this.name
    }

    static getInstance(){
        if(this.instance){
            return this.instance
        }else{
            return this.instance = new Singleton(this.name)
        }
    }

}

const Tom = Singleton.getInstance();
const Jack =  Singleton.getInstance();
console.log(Tom.getName());
console.log(Jack.getName())

// 配置管理器：在一个应用程序中，可能需要读取一个配置文件，但是如果多个对象都去读取同一个配置文件，会造成资源的浪费和配置的不一致。可以使用单例模式来确保只有一个对象去读取配置文件，并将配置信息存储在内存中，其他对象可以通过该单例对象获取配置信息。
// 状态管理器：在一个应用程序中，可能有多个组件需要共享一些状态，比如全局状态、用户信息等等。可以使用单例模式来确保只有一个对象管理这些状态，并提供方法来获取、更新这些状态、Vuex。
// 消息总线：在一个应用程序中，可能有多个组件需要进行通信，比如发送事件、监听事件等等。可以使用单例模式来确保只有一个对象管理消息总线，并提供方法来发送、监听消息。
// 资源管理器：在一个应用程序中，可能需要管理一些共享的资源，比如图片、音频等等。可以使用单例模式来确保只有一个对象管理这些资源，并提供方法来获取、释放这些资源。

 